#include "datamanager.h"

DataManager::DataManager(QObject *parent)
    : QObject{parent}
{}


void DataManager::RecvData(QSerialPort &serialPort, QByteArray &sendData)
{
    recvCurrentData.clear();
    recvCurrentData = serialPort.readAll();
    sendData = recvCurrentData;
}


int DataManager::SendIntruct(QSerialPort &serialPort, QByteArray &data)
{
    int iResult = 0;
    if (serialPort.isOpen()) {
        qint64 bytesWritten = serialPort.write(data);
        if (bytesWritten == -1) {
            iResult = -1;
            qDebug()<< "Error writing to serial port: " << serialPort.errorString();
        } else {
            iResult = bytesWritten;
            // qDebug() << "Sent " << bytesWritten << " bytes.";
        }
    } else {
        iResult = -2;
        qDebug() << "Serial port is not open. Cannot send data.";
    }

    // 发送之后, 将旧的数据清空, 这里当前先这么处理, 后面再优化吧
    recvCurrentData.clear();

    return iResult;
}


int DataManager::AnalyData(std::array<int, 8> &iData)
{
    int iResult = 0;

    return iResult;
}

int DataManager::Init()
{
    int iResult = 0;
    //读取串口信息
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        // 自动读取串口号添加到端口portBox中
        QSerialPort serial;
        serial.setPort(info);
        if(serial.open(QIODevice::ReadWrite))
        {
            // ui->portBox->addItem(info.portName());
            break;
            serial.close();
        }
    }
    QStringList baudList;   //波特率
    QStringList parityList; //校验位
    QStringList dataBitsList;   //数据位
    QStringList stopBitsList;   //停止位
    // 波特率    //波特率默认选择下拉第三项：9600
    baudList<<"1200"<<"2400"<<"4800"<<"9600"
             <<"14400"<<"19200"<<"38400"<<"56000"
             <<"57600"<<"115200";
    // 校验      //校验默认选择无
    parityList<<"无"<<"奇"<<"偶";
    // 数据位      //数据位默认选择8位
    dataBitsList<<"5"<<"6"<<"7"<<"8";
    // 停止位      //停止位默认选择1位
    stopBitsList<<"1"<<"2";

    return iResult;
}

// 查找可用串口，返回端口名称列表
QStringList DataManager::FindAvailableSerialPorts()
{
    QStringList availablePorts;
    const auto serialPortInfos = QSerialPortInfo::availablePorts();
    for (const QSerialPortInfo &info : serialPortInfos) {
        availablePorts.append(info.portName());
    }
    return availablePorts;
}

// 设置串口参数并打开串口
int DataManager::ConfigureAndOpenSerialPort(QSerialPort &serialPort, const QString &portName, qint32 baudRate)
{
    int iResult = 0;

    serialPort.setPortName(portName);
    serialPort.setBaudRate(baudRate);
    serialPort.setDataBits(QSerialPort::DataBits::Data8);
    serialPort.setStopBits(QSerialPort::OneStop);
    serialPort.setParity(QSerialPort::Parity::NoParity);
    // serialPort.setFlowControl(QSerialPort::NoFlowControl);

    int iBaudRate = serialPort.baudRate();

    if (serialPort.open(QIODevice::ReadWrite)) {
        qDebug() << "Serial port opened successfully.";
        iResult = 0;
    } else {
        iResult = -1;
        qDebug() << "Failed to open serial port: " << serialPort.errorString().toStdString();
    }

    return iResult;
}
